#pragma once
#include<iostream>
#include<string>
#include<ctime>
#include<pthread.h>

using namespace std;
//回调函数的本质是 “将函数作为参数传递，让其他代码在合适时机调用”，核心价值是解耦和灵活扩展
// 修正：回调函数需要接收线程池指针（否则无法访问线程池资源）
typedef void* (*callback_t)(void*args);//定义函数指针
static int num=1;

class Thread
{
public:
    static void*Routine(void*args)
    {
        Thread* td=static_cast<Thread*>(args);
        td->Entery();
        return nullptr;
    }
    //函数重载默认构造
    Thread()
    :cb_(nullptr),name_(""),isrunning_(false),start_timestamp_(0),tid_(0)
    {}

    //Thread 类需要同时接收回调函数和回调参数（即线程池指针）
    Thread(callback_t cb,void*args)
    :cb_(cb),cb_args(args),name_(""),isrunning_(0),start_timestamp_(0),tid_(0)
    {}
    void Run()
    {
        //Thread*td=new Thread();
        //name_="Thread-"+to_string(num++);//避免与线程池中业务层的命名冲突
        start_timestamp_=time(nullptr);
        isrunning_=true;
        pthread_create(&tid_,nullptr,Routine,this);
    }
    void Join()
    {
        if(isrunning_)
        {
            isrunning_=false;
            pthread_join(tid_,nullptr);
        }
    }
    uint64_t StartTimeStamp()
    {
        return start_timestamp_;
    }
    bool IsRunning()
    {
        return isrunning_;
    }
    void Entery()
    {
       if(cb_)
       {
            cb_(cb_args);// 回调时传入当前Thread实例（供线程池获取线程信息）
       }
    }
    pthread_t Gettid()
    {
        return tid_;
    }

    string Name()//获取名称
    {
        return name_;
    }

    void SetName(const string&name)//设置名称
    {
        name_=name;
    }
    ~Thread()
    {}
private:
    pthread_t tid_;
    string name_;
    uint64_t start_timestamp_;
    bool isrunning_;
    callback_t cb_;
    void *cb_args;
};